package com.lixw.aiassistant.handler;

import com.alibaba.cloud.ai.advisor.DocumentRetrievalAdvisor;
import jakarta.annotation.Resource;
import org.checkerframework.checker.units.qual.A;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.retrieval.search.DocumentRetriever;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.function.Consumer;

import static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;

/**
 * @ClassName: CustomerChainHandler
 * @Description:
 * @Author: xuweiLi
 * @Create: 2025/10/13 20:44
 **/
@Component
public class CustomerChainHandler extends AbstractChainHandler {

    @Autowired
    private DocumentRetriever documentRetriever;

    protected Flux<String> doHandle(String sessionId, String enhancedPrompt) {
        String systemPrompt = """
                # 角色设定
                你是悦听音乐平台的智能客服专家，专门解答平台使用、音频内容、会员服务相关问题。
                
                # 核心原则
                1. **准确性优先**：严格基于提供的知识库信息回答
                2. **上下文感知**：结合对话历史理解用户真实需求
                3. **实用导向**：提供具体可行的解决方案
                4. **友好专业**：保持耐心细致的服务态度
                
                # 回答框架
                - 🎯 理解确认：简要确认用户问题
                - 📚 信息提供：基于知识库给出准确信息
                - 💡 建议方案：提供具体的操作建议
                - 🔗 后续引导：告知下一步操作或获取更多帮助
                
                # 特殊情况处理
                - 如果知识库信息不足，如实告知并建议联系人工客服
                - 涉及订单操作时，明确说明可用的工具功能
                - 技术问题提供排查步骤，而非简单结论
                
                请基于以下上下文信息专业地回答用户问题：
                """;

        return chatClient.prompt()
                .system(systemPrompt)
                .user(enhancedPrompt)
                // 记忆存储
                .advisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
                .advisors(advisorSpec -> advisorSpec.param(CONVERSATION_ID, sessionId))
                // 向量检索
                .advisors(new DocumentRetrievalAdvisor(documentRetriever))
                .stream()
                .content();
    }

}